/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package codec.fibonacci;

import java.io.*;

/**
 *
 * @author Douglas & Pedro
 * 
 * A partir de um arquivo codificado na sequencia de Fibonacci, extrai
 * as informações originais
 */
public class DecodificadorArquivo {
   
    private File file;

    public DecodificadorArquivo() {
    }

    public DecodificadorArquivo(File file) {
        this.file = file;
    }

    /**
     * @return the file
     */
    public File getFile() {
        return file;
    }

    /**
     * @param file the file to set
     */
    public void setFile(File file) {
        this.file = file;
    }

/**
 * DecodificaArquivo.
 * Lendo o arquivo codificado na sequencia de Fibonacci, cria um novo arquivo
 * com mesmo nome e path, porém com prefixo no nome "dec_", com as informações
 * originais, antes da codificação de fibonacci.
 * @return
 * File com os dados do arquivo original
 * @throws FileNotFoundException
 * @throws IOException 
 */
    public File DecodificaArquivo() throws FileNotFoundException, IOException {
// Prepara arquivo para leitura
        FileReader f1 = new FileReader(file);
        Reader buffer = new BufferedReader(f1);
// Cria arquivo de saída, com informações originais        
        File arquivoDecodificado = new File( file.getParent() + "dec_" + file.getName());
        arquivoDecodificado.createNewFile();
        FileWriter escreveArquivo = new FileWriter(arquivoDecodificado);
        BufferedWriter saida = new BufferedWriter(escreveArquivo);
// Lê o arquivo original e grava no arquivo de saida
        ProcessaArquivo(buffer, escreveArquivo);
        return arquivoDecodificado;
    }
/**
 * ProcessaArquivo.
 * Lê sequencialmente o arquivo codificado e grava cada caracter extraído no
 * arquivo de saída. Possui um laço dentro do laço de leitura, pois para cada
 * char lido, pode ter mais de um char gravado, pois a sequencia de Fibonacci
 * deixa o número com menos de 2 bytes.
 * @param arquivo
 * @param saida
 * @throws IOException 
 */ 
    private void ProcessaArquivo(Reader arquivo, Writer saida) throws IOException {
        DecodeFibonacci c1 = new DecodeFibonacci();
        int i1;
        char escreve;
        while ((i1 = arquivo.read()) != -1) {
            c1.setCaracter((char) i1);
            c1.adicionaBitSet();
            while(c1.achouLetra()){
                escreve = c1.getCharSaida();
                System.out.println(escreve);
                saida.write(escreve);
            }
        }
        saida.close();
    }
}
